# @Time    : 2022/9/23 7:39
# @Author  : 南黎
# @FileName: 1.原始数据集的二维可视化图.py


import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

# (1)data1_ch5.csv
#读取数据
data1_ch5_data=pd.read_csv("data1_ch5.csv").values
#把数据分成两类
list_zero=np.array([])
list_one=np.array([])
for i in data1_ch5_data:
    if i[2]==0:
        list_zero=np.append(list_zero,i)
    elif i[2]==1:
        list_one=np.append(list_one,i)
list_zero=list_zero.reshape(-1,3)#改变形状
list_one=list_one.reshape(-1,3)#改变形状
#设置绘图基本参数
plt.rcParams["font.sans-serif"]=["SimHei"] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.title("data1_ch5")
plt.xlabel("feature1")
plt.ylabel("feature2")
#绘制散点图：scatter
plt.scatter(list_one[:,0],list_one[:,1],c='red',label='x',marker = "x")
plt.scatter(list_zero[:,0],list_zero[:,1],c='blue',label='o',marker = "o")
plt.legend()  # 显示图例
#展示图片并持久化保存
plt.savefig("1/"+"data1_ch5二维可视化图.png")
plt.show()

# # (2)data2_ch5.csv
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
def drawMy(datafile):# 在（1）的基础上使用封装函数
    #读取数据
    data=pd.read_csv(datafile).values
    #把数据分成两类
    list_zero=np.array([])
    list_one=np.array([])
    for i in data:
        if i[2]==0:
            list_zero=np.append(list_zero,i)
        elif i[2]==1:
            list_one=np.append(list_one,i)
    list_zero=list_zero.reshape(-1,3)#改变形状
    list_one=list_one.reshape(-1,3)#改变形状
    #设置绘图基本参数
    plt.rcParams["font.sans-serif"]=["SimHei"] #用来正常显示中文标签
    plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
    plt.title(datafile)
    plt.xlabel("feature1")
    plt.ylabel("feature2")
    #绘制散点图：scatter
    plt.scatter(list_one[:,0],list_one[:,1],c='red',label='x',marker = "x")
    plt.scatter(list_zero[:,0],list_zero[:,1],c='blue',label='o',marker = "o")
    plt.legend()  # 显示图例
    #展示图片并持久化保存
    plt.savefig("1/"+datafile+"二维可视化图.png")
    plt.show()
drawMy("data2_ch5.csv")


# (3)ex533.txt
import pandas as pd
import numpy as np
import re #多个分隔符同时使用的库
from matplotlib import pyplot as plt
ex533_data=pd.read_csv("ex533.txt").values
#数据处理
list_zero = np.array([])
list_one = np.array([])
ex533_csv_data=np.array([])
for i in range(len(ex533_data)):
    result_i=re.split("[ :]", ex533_data[i][0])#以空格和：作为分隔符，分割出数组
    result_i=list(map(float, result_i))

    #map映射函数，把列表中的字符串转为数字float类型 把float作用到result_i中的每一个元素

    #封前  ['1 1:-0.347926 2:0.47076']
    #分割后['1', '1', '-0.347926', '2', '0.47076']
    #观察可知 0号索引数据表示分类y值，2号索引数据表示特征1数据，4号索引数据表示特征2数据
        #把数据分成两类
    if result_i[0]==-1:
        list_zero=np.append(list_zero,np.array([result_i[2],result_i[4],result_i[0]]))
    elif result_i[0]==1:
        list_one=np.append(list_one,np.array([result_i[2],result_i[4],result_i[0]]))
    #持久化保存ex533_csv数据的准备
    ex533_csv_data=np.append(ex533_csv_data,np.array([result_i[2],result_i[4],result_i[0]]))
list_zero=list_zero.reshape(-1,3)#改变形状
list_one=list_one.reshape(-1,3)#改变形状
# 设置绘图基本参数
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
plt.title("ex533")
plt.xlabel("feature1")
plt.ylabel("feature2")
# 绘制散点图：scatter
plt.scatter(list_one[:, 0], list_one[:, 1], c='red', label='x', marker="x")
plt.scatter(list_zero[:, 0], list_zero[:, 1], c='blue', label='o', marker="o")
plt.legend()  # 显示图例
# 展示图片并持久化保存
plt.savefig("1/"+"ex533" + "二维可视化图.png")
plt.show()


#持久化保存ex533.csv，并且使之和data1_ch5.csv有一样的数据格式，可以调用我们前面封装的函数画图
ex533_csv_data=ex533_csv_data.reshape(-1,3)#改变形状
ex533_csv_data=pd.DataFrame(ex533_csv_data,columns=["feature1","feature2","label"],index=None)
ex533_csv_data.to_csv("ex533.csv",index=False)
drawMy("ex533.csv")#也可以调用前面的函数快速绘图了